home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGNG_C / TURBOCU1.LZH / SOUND.C < prev    next >
Text File  |  1987-09-05  |  4KB  |  153 lines

  1. /*
  2.  
  3.              GENERATING SOUNDS IN TURBO C
  4.  
  5.   Copyright (c), 1987, Telemacus Software Associates
  6.   Released to the public domain for private, non commerical
  7.   use only.
  8.  
  9.   This file contains three functions that can be employed
  10.   to control the speaker:
  11.  
  12.     1.  void qsound(unsigned int pitch);
  13.             Generates a tone that corresponds to
  14.             the "pitch" parameter.  The lower
  15.             the pitch, the higher the tone.
  16.  
  17.     2.  void qnosound();
  18.             Stops the speaker.
  19.  
  20.     3.  void qdelay_ticks(unsigned int ticks);
  21.             Causes a delay corresponding to the
  22.             "ticks" parameter.  There are approximately
  23.             eighteen ticks per second.    
  24.         
  25.  
  26.   QLIB registrants should compile these functions with the
  27.   FIXLARGE or REPLACE batch files.  Others should use the
  28.   command:
  29.  
  30.               tcc -B -ml qsound
  31.  
  32.   QLIB registration involves sending your name, address,
  33.   CIS ID, and $35 to:
  34.  
  35.         Lisa T. Vass
  36.         5311 Boulevard East # 3
  37.         West New York, New Jersey  07093
  38.  
  39.   Registrants receive the lastest QLIB release, complete
  40.   documentation, help/include files, and several shell
  41.   programs for developing utilities.  Updates are provided
  42.   free for one year.
  43. */
  44. void qsound
  45.     (
  46.     unsigned int pitch
  47.     )
  48. {
  49. /*
  50.  
  51. There are three distinct steps needed
  52. to generate a note:
  53.  
  54.     1.  Initialize timer port number 2.
  55.             As a trivia aside, timer port
  56.             number 0 is used for internal
  57.             data transfers and is best
  58.             left alone.  Timer port number
  59.             1 is the clock.  Timer port
  60.             number 2 is connected (quite
  61.             conveniently for this program)
  62.             to the speaker.  The code to
  63.             initialize this port is:      */
  64.  
  65. asm    mov    al, 0b6h
  66. asm    out    043h, al
  67.  
  68. /*
  69.     2.  The next step is to load the
  70.             the pitch into timer port
  71.             number 2.  This has to be
  72.             done on a byte by byte basis.
  73.             The code to do this is:         */
  74.  
  75. asm    mov    ax, pitch
  76. asm    out    042h, al
  77. asm    xor    ah, al
  78. asm    xor    al, ah
  79. asm    xor    ah, al
  80. asm    out    042h, al
  81.  
  82. /*
  83.     3.  The last step is to turn the
  84.             speaker on.  This is done
  85.             by turning the least significant
  86.             bit (which is actually the
  87.             tone generation bit) on; and
  88.             by turning its neighbor (the
  89.             speaker gate bit) on.  The
  90.             other six bits must remain
  91.             undisturbed.  The code to
  92.             to this is:                         */
  93.  
  94. asm    in    al, 061h
  95. asm    or    al, 03
  96. asm    out    061h, al
  97.  
  98. /*
  99.  
  100. At this point, the speaker will be
  101. happily buzzing away.  In fact, it will
  102. continue until one of two things happen:
  103. a reboot; or a set of instructions get
  104. executed that turn the speaker off.   */
  105. }
  106.  
  107. void qnosound()
  108. {
  109. /*
  110.  
  111. Turning the speaker off is fairly
  112. straight-forward.  The tone generation
  113. and speaker gate bits must be set to
  114. zero (turned off) while the other
  115. six bits remain undisturbed.  The
  116. code for this is:                            */
  117.  
  118. asm    in    al, 061h
  119. asm    and    al, 0fch
  120. asm    out    061h, al
  121.  
  122. }
  123.  
  124. void qdelay_ticks
  125.     (
  126.     unsigned int ticks
  127.     )
  128. /*
  129.  
  130. There are approximately 18 clock ticks per second
  131. recorded in a double word located in the BIOS
  132. communication area.  Of particular interest here
  133. is the lower word located at 0:46c.  This word
  134. can be queried for an initial value, and further
  135. queried to measure an elapsed time.  The code
  136. to perform this function is given below.  Note
  137. that a delay in seconds can be performed simply
  138. by factoring the "tick" value.
  139.  
  140.     qdelay_ticks(5 * 18); for example, will
  141.     generate a delay of approximately five
  142.     seconds.
  143. */
  144. {
  145. unsigned far *timerlow = {(unsigned far *) 0x46c};
  146. unsigned start_time;
  147. unsigned current_time = 0;
  148.     start_time = *timerlow;
  149.     do
  150.         current_time = *timerlow;
  151.     while (current_time - start_time < ticks);
  152. }
  153. . ... ...-....1200 N81N         ........